package modulemgr

import (
	"clientDemo/service/modulemgr"
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

var _m = &ModuleManager{}

func Get() *ModuleManager {
	return _m
}

type ModuleManager struct {
	modules      map[string]modulemgr.IModule
	modulesOrder []string
}

func (m *ModuleManager) RegisterModule(name string, module modulemgr.IModule) error {
	if m.modules == nil {
		m.modules = make(map[string]modulemgr.IModule)
	}
	if _, ok := m.modules[name]; ok {
		return fmt.Errorf("模块已存在:%s", name)
	}
	m.modules[name] = module
	m.modulesOrder = append(m.modulesOrder, name)
	return nil
}
func (m *ModuleManager) GetModule(name string) modulemgr.IModule {
	return m.modules[name]
}
func (m *ModuleManager) Init() (bool, error) {
	return true, nil
}
func (m *ModuleManager) RunAll() (bool, error) {

	// 创建一个信号通道
	sigs := make(chan os.Signal, 1)
	// 监听终止信号
	signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)

	for _, name := range m.modulesOrder {
		module := m.modules[name]
		if module == nil {
			continue
		}
		if _, err := module.Init(m); err != nil {
			return false, err
		}
	}
	for _, name := range m.modulesOrder {
		module := m.modules[name]
		if module == nil {
			continue
		}
		if _, err := module.Run(m); err != nil {
			return false, err
		}
	}

	// 等待信号
	<-sigs
	fmt.Println("收到关闭信号，正在退出...")
	return true, nil
}

func (m *ModuleManager) StopAll() (bool, error) {
	return true, nil
}
